#[cfg(test)]
pub mod test_box {

    /* 
相关的概念
·指针:一个变量在内存中包含的是一个地址(指向其它数据)
·Rust中最常见的指针就是“引用”
·引用:
- 使用 &
- 借用它指向的值
- 没有其余开销
- 最常见的指针类型

智能指针
·智能指针是这样一些数据结构:
- 行为和指针相似
- 有额外的元数据和功能

引用计数(reference counting)智能指针类型
·通过记录所有者的数量，使一份数据被多个所有者同时持有
·并在没有任何所有者时自动清理数据

引用和智能指针的其它不同
·引用:
只借用数据
·智能指针:
很多时候都拥有它所指向的数据

智能指针的例子
·String 和 Vec<T>
·都拥有一片内存区域，且允许用户对其操作
·还拥有元数据(例如容量等)
·提供额外的功能或保障(String保障其数据是合法的UTF-8 编码)

智能指针的实现
·智能指针通常使用struct 实现，并且实现了:
- Deref和 Drop 这两个 trait
·Deref trait:允许智能指针struct 的实例像引用一样使用
·Drop trait:允许你自定义当智能指针实例走出作用域时的代码

本章内容
·介绍标准库中常见的智能指针
- Box<T>:在heap内存上分配值
- Rc<T>:启用多重所有权的引用计数类型
- Ref<T> 和 RefMut<T>，通过 RefCell<T>访问:在运行时而不是编译时强制借用规则的类型
·此外:
- 内部可变模式(interior mutability pattern):不可变类型暴露出可修改其内部值的API
- 引用循环(reference cycles):它们如何泄露内存，以及如何防止其发生。

Box<T> 是最简单的智能指针: stack(指针) -> heap(数据)
- 允许你在heap上存储数据(而不是stack)
- stack 上是指向heap数据的指针
- 没有性能开销
- 没有其它额外功能
- 实现了 Deref trait和Drop trait

Box<T> 的常用场景
·在编译时，某类型的大小无法确定。但使用该类型时，上下文却需要知道它的确切大小。
·当你有大量数据，想移交所有权，但需要确保在操作时数据不会被复制。
·使用某个值时，你只关心它是否实现了特定的trait，而不关心它的具体类型。
*/

    #[test]
    fn box01() {
        let b = Box::new(5);
        println!("b = {}", b);
    }

/*
使用 Box 赋能递归类型
·在编译时，Rust需要知道一个类型所占的空间大小。
Cons
·而递归类型的大小无法在编译时确定。
Cons
Cons
Cons
·但 Box类型的大小确定
i32
i32
i32
Cons
i32
在递归类型中使用Box就可解决上述问题。
i32
·函数式语言中的Cons List。
2人正 */
    
}